package io.github.stary1993.kite.admin.controller;


import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.github.stary1993.kite.admin.entity.SysUser;
import io.github.stary1993.kite.admin.service.SysUserService;
import io.github.stary1993.kite.admin.vo.UserExcelVO;
import io.github.stary1993.kite.core.constant.CommonConstants;
import io.github.stary1993.kite.core.util.R;
import io.github.stary1993.kite.excel.annotation.RequestExcel;
import io.github.stary1993.kite.excel.annotation.ResponseExcel;
import io.github.stary1993.kite.syslog.annotation.SysLog;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springdoc.api.annotations.ParameterObject;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * @author stary1993
 */
@RestController
@RequiredArgsConstructor
@RequestMapping("/user")
@Tag(name = "用户管理模块")
public class SysUserController {

    private final SysUserService userService;

    /**
     * 查询所有用户信息
     *
     * @return 用户信息列表
     */
    @GetMapping
    @Operation(summary = "查询所有用户信息", description = "获取系统中所有的用户信息列表")
    public R listUsers() {
        List<SysUser> list = userService.list();
        return R.ok(list);
    }

    /**
     * 分页查询用户信息
     *
     * @param page  分页对象
     * @param query 查询条件
     * @return 分页用户信息列表
     */
    @GetMapping("/page")
    @Operation(summary = "分页查询用户信息", description = "根据查询条件分页获取用户信息列表")
    public R listUsersWithPage(@ParameterObject Page<SysUser> page,
                               @ParameterObject SysUser query) {
        return R.ok(userService.page(page, Wrappers.query(query)));
    }


    /**
     * 通过ID查询用户信息
     *
     * @param id ID
     * @return 用户信息
     */
    @GetMapping("/{id}")
    @Operation(summary = "通过ID查询用户信息", description = "根据用户ID获取用户详细信息")
    public R details(@PathVariable Long id) {
        return R.ok(userService.detailsById(id));
    }

    /**
     * 查询用户信息
     *
     * @param query 查询条件
     * @return 不为空返回用户名
     */
    @GetMapping("/details")
    public R getDetails(@ParameterObject SysUser query) {
        SysUser sysUser = userService.getOne(Wrappers.query(query), false);
        return R.ok(sysUser == null ? null : CommonConstants.SUCCESS);
    }

    /**
     * 删除用户信息
     *
     * @param ids ID
     * @return R
     */
    @SysLog("删除用户信息")
    @DeleteMapping
    @Operation(summary = "删除用户", description = "根据ID删除用户")
    public R userDel(@RequestBody Long[] ids) {
        return R.ok(userService.removeById(ids));
    }

    /**
     * 添加用户
     *
     * @param user 用户信息
     * @return success/false
     */
    @SysLog("添加用户")
    @PostMapping
    public R user(@RequestBody SysUser user) {
        return R.ok(userService.save(user));
    }

    /**
     * 更新用户信息
     *
     * @param user 用户信息
     * @return R
     */
    @SysLog("更新用户信息")
    @PutMapping
    public R updateUser(@Valid @RequestBody SysUser user) {
        return R.ok(userService.updateById(user));
    }


    /**
     * 导出excel 表格
     * @return
     */
    @ResponseExcel
    @GetMapping("/export")
    public List export() {
        return userService.exportUser();
    }

    /**
     * 导入用户
     * @param excelVOList 用户列表
     * @param bindingResult 错误信息列表
     * @return R
     */
    @PostMapping("/import")
    public R importUser(@RequestExcel List<UserExcelVO> excelVOList, BindingResult bindingResult) {
        return userService.importUser(excelVOList, bindingResult);
    }
}
